package linz

/**
 * 函数中复杂操作
 */
fun main() {
    //TODO 函数中使用参数是函数,这个用于事件点击，很Nice
    // 简化方式
    loginAPI("Linzhi", "123456") { msg: String, code: Int ->
        println("登录结果：msg:$msg， code:$code")
    }
    //方式二,作为参数,不建议使用，了解就行
//    loginAPI("Linzhi", "123456", { msg: String, code: Int ->
//        println("登录结果：msg:$msg， code:$code")
//    })

    //方式二,作为参数,指定命名
    loginAPI("Linzhi", "123456", responseResult = { msg: String, code: Int ->
        println("登录结果：msg:$msg， code:$code")
    })

    //TODO inline 内联
    // 有lambda作为参数，就需要声明成内联，不使用，在调用端，会生成多个对象来完成lambda的调用（性能损耗）
    // 内联，相当于C++ #define 宏定义 宏替换
    inlineLoginAPI("", "") { msg: String, code: Int ->
        println("登录结果：msg:$msg， code:$code")
    }

    //TODO 函数引用
    // lambda属于函数类型的对象， 需要把methodResponseResult普通函数==> 函数类型的对象（函数引用）
    loginAPI("Linzhi", "123456", ::methodResponseResult)

    //TODO 函数返回匿名函数
    val anonymousReturn = lambdaReturn("")
    println(anonymousReturn("Kotlin", 1666))


    // TODO 函数Kotlin效率体现
    listOf("SZ","SH","BJ","GZ").zip(listOf(1,2,3,4)).toMap().map {
        println("Key :${it.key}, value: {${it.value}}")
    }

    // TODO 自定义foreach
    listOf(1,2,3).forEach { println(it) }

    println()
    listOf(4,5,6).mForEach { println(it) }

    println()

    listOf(44,55,66).mForEach2 { println(it) }
    
    println()
    listOf(7,8,9).mForEach3 { println(this) }

    println()
    listOf(14,25,36).mForEach4 { println(this) }

    //method.() 的写法
    val repeatFun: String.(Int) -> String = { this.repeat(it) }
    val repeatFunV2: (String, Int) -> String = { str, times -> str.repeat(times) }
    "a".repeatFun(10)
    repeatFun("1", 10)
    repeatFunV2("a", 20)


}

private inline fun <T> Iterable<T>.mForEach(lambda:(T) -> Unit) {
    for (item in this) lambda(item)
}

private inline fun<T> Iterable<T>.mForEach2(lambda: (T) -> Unit) = run{ for (item in this) lambda(item)}

private inline fun<T> Iterable<T>.mForEach3(lambda: T.() -> Unit) = run{ for (item in this) lambda(item)}

private inline fun<T> Iterable<T>.mForEach4(lambda: T.() -> Unit) = run{ for (item in this) lambda(item)}

private inline fun <R> r(lambda: () -> R) = lambda()



fun lambdaReturn(info: String):(String,Int)->String {
    println("print info:$info")
    return { msg:String, code:Int ->
        "登录结果：msg:$msg， code:$code"
    }
}

fun methodResponseResult(msg:String,code:Int){
    println("登录结果：msg:$msg， code:$code")
}

inline fun inlineLoginAPI(username: String, password: String, responseResult: (String, Int) -> Unit){
    ""
}


fun loginAPI(username: String, password: String, responseResult: (String, Int) -> Unit) {
    if (username?.length > 3 && password?.length > 3) {
        //登录成功
        responseResult("Login success", 200)
    }
}